﻿
// XiaoDuDrawingView.cpp: CXiaoDuDrawingView 类的实现
//

#include "pch.h"
#include "framework.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义，并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "XiaoDuDrawing.h"
#endif
#include "XiaoDuDrawingDoc.h"
#include "XiaoDuDrawingView.h"
#include"CShapeDlg.h"
#include"Shape.h"
#include"cstringt.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CXiaoDuDrawingView

IMPLEMENT_DYNCREATE(CXiaoDuDrawingView, CView)

BEGIN_MESSAGE_MAP(CXiaoDuDrawingView, CView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CXiaoDuDrawingView::OnFilePrintPreview)
	ON_WM_CONTEXTMENU()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONDBLCLK()//双击
	ON_WM_RBUTTONDBLCLK()
END_MESSAGE_MAP()

// CXiaoDuDrawingView 构造/析构

CXiaoDuDrawingView::CXiaoDuDrawingView() noexcept
{
	// TODO: 在此处添加构造代码

}

CXiaoDuDrawingView::~CXiaoDuDrawingView()
{
}

BOOL CXiaoDuDrawingView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式

	return CView::PreCreateWindow(cs);
}

// CXiaoDuDrawingView 绘图
void CXiaoDuDrawingView::OnDraw(CDC* pDC)
{
	CXiaoDuDrawingDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	for (int i = 0; i < pDoc->m_Elements.GetCount(); i++)
	{
		CShape* p = (CShape*)pDoc->m_Elements[i];
		p->Draw(pDC);
	}
}


// CXiaoDuDrawingView 打印
void CXiaoDuDrawingView::OnFilePrintPreview()
{
#ifndef SHARED_HANDLERS
	AFXPrintPreview(this);
#endif
}

BOOL CXiaoDuDrawingView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}


void CXiaoDuDrawingView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 添加额外的打印前进行的初始化过程
}

void CXiaoDuDrawingView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 添加打印后进行的清理过程
}

//void CXiaoDuDrawingView::OnRButtonUp(UINT /* nFlags */, CPoint point)
//{
//	ClientToScreen(&point);
//	OnContextMenu(this, point);
//}

void CXiaoDuDrawingView::OnContextMenu(CWnd* /* pWnd */, CPoint point)
{
#ifndef SHARED_HANDLERS
	//theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
#endif
}


// CXiaoDuDrawingView 诊断

#ifdef _DEBUG
void CXiaoDuDrawingView::AssertValid() const
{
	CView::AssertValid();
}

void CXiaoDuDrawingView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CXiaoDuDrawingDoc* CXiaoDuDrawingView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CXiaoDuDrawingDoc)));
	return (CXiaoDuDrawingDoc*)m_pDocument;
}
#endif //_DEBUG


// CXiaoDuDrawingView 消息处理程序

//Ctrl+鼠标左键新建图元
void CXiaoDuDrawingView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if ((nFlags & MK_CONTROL) == MK_CONTROL)//Ctrl键按下
	{
		CXiaoDuDrawingDoc* pDoc = GetDocument();
		ASSERT_VALID(pDoc);
		if (!pDoc)
			return;

		CClientDC dc(this);
		CPoint pntLogical = point;
		OnPrepareDC(&dc);
		dc.DPtoLP(&pntLogical);//DP->LP进行转换
		
		CShape* p = NULL;
		//CShapeDlg dlg;
		CShapeDlg dlg(p);
		switch (pDoc->m_ElementType)
		{
		case SQUARE:
			p = new CSquare(pntLogical.x, pntLogical.y, 100);
			break;
		case RECTANGLE:
			p = new CRectangle(pntLogical.x, pntLogical.y, 200, 100);
			break;
		case CIRCLE:
			p = new CCircle(pntLogical.x, pntLogical.y, 50);
			break;
		case ELLIPSE:
			p = new CEllipse(pntLogical.x, pntLogical.y, 200, 100);
			break;
		case TRIANGLE:
			p = new CTriangle(pntLogical.x, pntLogical.y, 200);
			break;
		case TEXT:
			p = new CText(pntLogical.x, pntLogical.y, 30, 60, (CString)"Hello XiaoDu!!!");
			break;
		}
		p->SetPen(dlg.m_pen_type, dlg.m_pen_width, dlg.m_penColorBtn.GetColor());
		p->SetBrush(dlg.m_brush_type, dlg.m_brushColorBtn.GetColor());

		pDoc->m_Elements.Add(p);
		pDoc->SetModifiedFlag();
		pDoc->UpdateAllViews(NULL);
	}
	
	CView::OnLButtonDown(nFlags, point);
}


//右键双击编辑修改图元属性
void CXiaoDuDrawingView::OnRButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CXiaoDuDrawingDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc) return;
	CClientDC dc(this);
	CPoint pntLogical = point;
	OnPrepareDC(&dc);
	dc.DPtoLP(&pntLogical);
	CShape* p = NULL;
	bool ShapeMatched = false;
	CShape* pMatchedShape = NULL;
	// 从后往前遍历元素，找到匹配的图形
	for (int i = (int)pDoc->m_Elements.GetCount() - 1; i >= 0; i--)
	{
		p = (CShape*)pDoc->m_Elements[i];
		if (p->IsMatched(pntLogical))// 匹配到图形，修改其属性
		{
			//CShapeDlg dlg;
			CShapeDlg dlg(p);
			dlg.m_x = p->OrgX;
			dlg.m_y = p->OrgY;
			dlg.m_pen_color = p->BorderColor;
			dlg.m_pen_width = p->BorderWidth;
			dlg.m_brush_color = p->FillColor;
			dlg.m_pen_type = p->BorderType;
			dlg.m_brush_type = p->FillType;
			dlg.m_Type = p->Type;
			dlg.m_w = p->Width;
			dlg.m_h = p->Height;
			dlg.m_text = p->Text;

			if (dlg.DoModal() == IDOK)
			{
			// 释放旧的图元对象
			delete pDoc->m_Elements[i];
			pDoc->m_ElementType = dlg.m_Type;
			//根据对话框选择的图元属性新建图元
			switch (dlg.m_Type)
			{
			case SQUARE:
				p = new CSquare(dlg.m_x, dlg.m_y, dlg.m_w);
				break;
			case RECTANGLE:
				p = new CRectangle(dlg.m_x, dlg.m_y, dlg.m_w, dlg.m_h);
				break;
			case CIRCLE:
				p = new CCircle(dlg.m_x, dlg.m_y, dlg.m_w);
				break;
			case ELLIPSE:
				p = new CEllipse(dlg.m_x, dlg.m_y, dlg.m_w, dlg.m_h);
				break;
			case TRIANGLE:
				p = new CTriangle(dlg.m_x, dlg.m_y, dlg.m_w);
				break;
			case TEXT:
				p = new CText(dlg.m_x, dlg.m_y, dlg.m_w, dlg.m_h, dlg.m_text);
				break;
			}
				// 将当前遍历的对象指针指向新的图元对象
				pDoc->m_Elements[i] = p;
				//设置画笔属性
				p->SetPen(dlg.m_pen_type, dlg.m_pen_width, dlg.m_penColorBtn.GetColor());
				//设置画刷属性
				p->SetBrush(dlg.m_brush_type, dlg.m_brushColorBtn.GetColor());

				pDoc->SetModifiedFlag();
				pDoc->UpdateAllViews(NULL);
			}
			ShapeMatched = true;
			break; // 找到匹配的图形后退出循环
		}
	}
	if (ShapeMatched)
	{
		Invalidate(); // 刷新窗口
	}
	CView::OnRButtonDblClk(nFlags, point);
}


//鼠标左键双击删除图元
void CXiaoDuDrawingView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{	// TODO: 在此添加消息处理程序代码 
	CXiaoDuDrawingDoc* pDoc = GetDocument();
	CShape* p;
	for (int i = pDoc->m_Elements.GetSize() - 1; i >= 0; i--)
	{
		p = (CShape*)pDoc->m_Elements[i];
		if (p->IsMatched(point))//找到匹配的图形
		{
			pDoc->m_Elements.RemoveAt(i);
			delete p;//删除
			pDoc->UpdateAllViews(NULL);
			break;
		}
	}
	CView::OnLButtonDblClk(nFlags, point);
}

//
//void CXiaoDuDrawingView::OnLButtonDown(UINT nFlags, CPoint point)
//{
//	// TODO: 在此添加消息处理程序代码和/或调用默认值
//	if ((nFlags & MK_CONTROL) == MK_CONTROL)//Ctrl键按下
//	{
//		CXiaoDuDrawingDoc* pDoc = GetDocument();
//		ASSERT_VALID(pDoc);
//		if (!pDoc)
//			return;
//
//		CClientDC dc(this);
//		CPoint pntLogical = point;
//		OnPrepareDC(&dc);
//		dc.DPtoLP(&pntLogical);//DP->LP进行转换
//
//		CShape* p = NULL;
//		//CShapeDlg dlg;
//		CShapeDlg dlg(p);
//		switch (pDoc->m_ElementType)
//		{
//		case SQUARE:
//			dlg.m_strType = "Square";
//			p = new CSquare(pntLogical.x, pntLogical.y, 100);
//			break;
//		case RECTANGLE:
//			dlg.m_strType = "Rectangle";
//			p = new CRectangle(pntLogical.x, pntLogical.y, 200, 100);
//			break;
//		case CIRCLE:
//			dlg.m_strType = "Circle";
//			p = new CCircle(pntLogical.x, pntLogical.y, 50);
//			break;
//		case ELLIPSE:
//			dlg.m_strType = "Ellipse";
//			p = new CEllipse(pntLogical.x, pntLogical.y, 200, 100);
//			break;
//		case TRIANGLE:
//			dlg.m_strType = "Triangle";
//			p = new CTriangle(pntLogical.x, pntLogical.y, 200);
//			break;
//		case TEXT:
//			dlg.m_strType = "Text";
//			p = new CText(pntLogical.x, pntLogical.y, 30, 60);
//			break;
//		}
//		p->SetPen(dlg.m_pen_type, dlg.m_pen_width, dlg.m_penColorBtn.GetColor());
//		p->SetBrush(dlg.m_brush_type, dlg.m_brushColorBtn.GetColor());
//
//		pDoc->m_Elements.Add(p);
//		pDoc->SetModifiedFlag();
//		pDoc->UpdateAllViews(NULL);
//	}
//	// ----- 测试代码 begin -----
//	//正方形
//	//
//	//CShape* p1 = new CSquare(pntLogical.x, pntLogical.y, 100);
//	//pDoc->m_Elements.Add(p1);
//	//pDoc->SetModifiedFlag();
//	//pDoc->UpdateAllViews(NULL);
//	////矩形
//	//CShape* p2 = new CRectangle(pntLogical.x, pntLogical.y, 100, 200);
//	//pDoc->m_Elements.Add(p2);
//	//pDoc->SetModifiedFlag();
//	//pDoc->UpdateAllViews(NULL);
//	//
//	//圆
//	/*CShape* p3 = new CCircle(pntLogical.x, pntLogical.y, 100);
//	pDoc->m_Elements.Add(p3);
//	pDoc->SetModifiedFlag();
//	pDoc->UpdateAllViews(NULL);*/
//	//椭圆
//	/*CShape* p4 = new CEllipse(pntLogical.x, pntLogical.y, 100, 50);
//	pDoc->m_Elements.Add(p4);
//	pDoc->SetModifiedFlag();
//	pDoc->UpdateAllViews(NULL);*/
//	//三角形
//	/*CShape* p5 = new CTriangle(pntLogical.x, pntLogical.y, 100, 100,100);
//	pDoc->m_Elements.Add(p5);
//	pDoc->SetModifiedFlag();
//	pDoc->UpdateAllViews(NULL);*/
//	//文本
//	/*CShape* p6 = new CText(pntLogical.x, pntLogical.y, (CString)"Hello XiaoDu", 30, 60);
//	pDoc->m_Elements.Add(p6);
//	pDoc->SetModifiedFlag();
//	pDoc->UpdateAllViews(NULL);*/
//	// ----- 测试代码 end -----
//
//	CView::OnLButtonDown(nFlags, point);
//}

////右键双击编辑修改图元属性
//void CXiaoDuDrawingView::OnRButtonDblClk(UINT nFlags, CPoint point)
//{
//	// TODO: 在此添加消息处理程序代码和/或调用默认值
//	CXiaoDuDrawingDoc* pDoc = GetDocument();
//	ASSERT_VALID(pDoc);
//	if (!pDoc) return;
//	CClientDC dc(this);
//	CPoint pntLogical = point;
//	OnPrepareDC(&dc);
//	dc.DPtoLP(&pntLogical);
//	CShape* p = NULL;
//	bool ShapeMatched = false;
//	CShape* pMatchedShape = NULL;
//	// 从后往前遍历元素，找到匹配的图形
//	for (int i = (int)pDoc->m_Elements.GetCount() - 1; i >= 0; i--)
//	{
//		p = (CShape*)pDoc->m_Elements[i];
//		CShape** pp = &p;
//		if (p->IsMatched(pntLogical))
//		{
//			//CShapeDlg dlg;
//			CShapeDlg dlg(p);
//			// 匹配到图形，修改其属性
//			dlg.m_x = p->OrgX;
//			dlg.m_y = p->OrgY;
//			dlg.m_pen_color = p->BorderColor;
//			dlg.m_pen_width = p->BorderWidth;
//			dlg.m_brush_color = p->FillColor;
//			dlg.m_pen_type = p->BorderType;
//			dlg.m_brush_type = p->FillType;
//			dlg.m_Type = p->Type;
//			dlg.m_w = p->Width;
//			dlg.m_h = p->Height;
//			dlg.m_text = p->Text;
//
//			if (dlg.DoModal() == IDOK)
//			{
//				// 释放旧的图元对象
//				delete pDoc->m_Elements[i];
//				pDoc->m_ElementType = dlg.m_Type;
//				/*p->OrgX = dlg.m_x;
//				p->OrgY = dlg.m_y;
//				p->BorderColor = dlg.m_pen_color;
//				p->BorderWidth = dlg.m_pen_width;
//				p->BorderType = dlg.m_pen_type;
//				p->FillColor = dlg.m_brush_color;
//				p->FillType = dlg.m_brush_type;
//				p->height = dlg.m_h;
//				p->width = dlg.m_w;
//				p->text = dlg.m_text;*/
//				//p->Type = dlg.m_Type;
//				/*p->SetPen(dlg.m_pen_type, dlg.m_pen_width, dlg.m_penColorBtn.GetColor());
//				p->SetBrush(dlg.m_brush_type, dlg.m_brushColorBtn.GetColor());*/
//				////p->SetValue(dlg.m_Type, dlg.m_x, dlg.m_y, dlg.m_w, dlg.m_h, dlg.m_text);
//				switch (dlg.m_Type)
//				{
//				case SQUARE:
//					dlg.m_strType = "Square";
//					p = new CSquare(dlg.m_x, dlg.m_y, dlg.m_w);
//					break;
//				case RECTANGLE:
//					dlg.m_strType = "Rectangle";
//					p = new CRectangle(dlg.m_x, dlg.m_y, dlg.m_w, dlg.m_h);
//					break;
//				case CIRCLE:
//					dlg.m_strType = "Circle";
//					p = new CCircle(dlg.m_x, dlg.m_y, dlg.m_w);
//					break;
//				case ELLIPSE:
//					dlg.m_strType = "Ellipse";
//					p = new CEllipse(dlg.m_x, dlg.m_y, dlg.m_w, dlg.m_h);
//					break;
//				case TRIANGLE:
//					dlg.m_strType = "Triangle";
//					p = new CTriangle(dlg.m_x, dlg.m_y, dlg.m_w);
//					break;
//				case TEXT:
//					dlg.m_strType = "Text";
//					p = new CText(dlg.m_x, dlg.m_y, dlg.m_w, dlg.m_h);
//					break;
//				}
//				// 将当前遍历的对象指针指向新的图元对象
//				pDoc->m_Elements[i] = p;
//				p->SetPen(dlg.m_pen_type, dlg.m_pen_width, dlg.m_penColorBtn.GetColor());
//				p->SetBrush(dlg.m_brush_type, dlg.m_brushColorBtn.GetColor());
//				pDoc->SetModifiedFlag();
//				pDoc->UpdateAllViews(NULL);
//			}
//			ShapeMatched = true;
//			break; // 找到匹配的图形后退出循环
//		}
//	}
//	if (ShapeMatched)
//	{
//		Invalidate(); // 刷新窗口
//	}
//	CView::OnRButtonDblClk(nFlags, point);
//}
